package ioc

import (
	"gitee.com/yimtune/webook/internal/repository/dao"
	"gitee.com/yimtune/webook/pkg/logger"
	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	glogger "gorm.io/gorm/logger"
)

func InitDB(l logger.LoggerV1) *gorm.DB {
	type Config struct {
		DSN string `yaml:"dsn"`
	}
	//var cfg Config = Config{ // 默认配置方式 验证不生效 即使yaml 里设置的值 也会走这个默认值
	//	DSN: "root:12345678@tcp(localhost:3306)/webook",
	//}
	var cfg Config
	err := viper.UnmarshalKey("db", &cfg)
	if err != nil {
		panic(err)
	}
	db, err := gorm.Open(mysql.Open(cfg.DSN), &gorm.Config{
		Logger: glogger.New(goormLoggerFunc(l.Debug), glogger.Config{
			// 慢查询
			SlowThreshold: 0,
			LogLevel:      glogger.Info,
		}),
	})
	if err != nil {
		panic(err)
	}

	err = dao.InitTables(db)
	if err != nil {
		panic(err)
	}
	return db
}

//  Writer log writer interface
//  type Writer interface {
//	Printf(string, ...interface{})
// }

// 使用函数衍生类型   让goormLoggerFunc 签名 和接口里面的方法签名一致
// 函数衍生类型实现接口
type goormLoggerFunc func(msg string, fields ...logger.Field)

// goormLoggerFunc 实现 glogger.Writer 接口
func (g goormLoggerFunc) Printf(s string, i ...interface{}) {
	g(s, logger.Field{Key: "args", Val: i})
}
